// import { createScopedLogger } from '~/utils/logger';
// import { createReactAgent } from '@langchain/langgraph/prebuilt';
// import { ChatOpenAI } from '@langchain/openai';
// import { FRIDAY_LLM_CONFIG } from '~/utils/constants';
// import { MemorySaver } from '@langchain/langgraph';
// import clientManager from './client.server';

// // const logger = createScopedLogger('duo-chat.server');

// // 性能优化：Agent 和工具缓存管理器
// class AgentManager {
//   private static _instance: AgentManager;
//   private _agentCache = new Map<string, any>();
//   private _toolsCache: any[] | null = null;
//   private _toolsCacheExpiry: number = 0;
//   private _modelCache = new Map<string, ChatOpenAI>();
//   private _memorySaver: MemorySaver = new MemorySaver();
//   private readonly _toolsCacheTtl = 5 * 60 * 1000; // 5分钟缓存
//   private readonly _maxCacheSize = 10; // 最大缓存数量

//   private constructor() {}

//   static getInstance(): AgentManager {
//     if (!AgentManager._instance) {
//       AgentManager._instance = new AgentManager();
//     }

//     return AgentManager._instance;
//   }

//   // 获取或创建 LLM 模型实例（带缓存）
//   async getModel(modelName: string): Promise<ChatOpenAI> {
//     if (this._modelCache.has(modelName)) {
//       return this._modelCache.get(modelName)!;
//     }

//     // 清理缓存大小
//     if (this._modelCache.size >= this._maxCacheSize) {
//       const firstKey = this._modelCache.keys().next().value;

//       if (firstKey) {
//         this._modelCache.delete(firstKey);
//       }
//     }

//     const model = new ChatOpenAI({
//       modelName,
//       temperature: 0.9,
//       configuration: {
//         baseURL: FRIDAY_LLM_CONFIG.API_BASE_URL,
//         apiKey: FRIDAY_LLM_CONFIG.API_KEY,
//       },
//       maxTokens: 8000,
//     });

//     this._modelCache.set(modelName, model);

//     return model;
//   }

//   // 获取工具列表（带缓存和过期机制）
//   async getTools(): Promise<any[]> {
//     const now = Date.now();

//     if (this._toolsCache && now < this._toolsCacheExpiry) {
//       return this._toolsCache;
//     }

//     try {
//       this._toolsCache = await clientManager.getTools();
//       console.log('getTools', JSON.stringify(this._toolsCache, null, 2));
//       this._toolsCacheExpiry = now + this._toolsCacheTtl;

//       return this._toolsCache;
//     } catch (error) {
//       if (this._toolsCache) {
//         return this._toolsCache;
//       }

//       throw error;
//     }
//   }

//   // 获取或创建 Agent 实例（带缓存）
//   async getAgent(modelName: string): Promise<ReturnType<typeof createReactAgent>> {
//     const cacheKey = modelName;

//     if (this._agentCache.has(cacheKey)) {
//       return this._agentCache.get(cacheKey);
//     }

//     // 清理缓存大小
//     if (this._agentCache.size >= this._maxCacheSize) {
//       const firstKey = this._agentCache.keys().next().value;

//       if (firstKey) {
//         this._agentCache.delete(firstKey);
//       }
//     }

//     const [model, tools] = await Promise.all([this.getModel(modelName), this.getTools()]);
//     const agent = createReactAgent({
//       llm: model,
//       tools,
//       checkpointSaver: this._memorySaver,
//     });

//     this._agentCache.set(cacheKey, agent);

//     return agent;
//   }

//   // 清理过期缓存
//   clearExpiredCache(): void {
//     const now = Date.now();

//     if (now >= this._toolsCacheExpiry) {
//       this._toolsCache = null;
//     }
//   }

//   // 手动清理所有缓存（用于内存管理）
//   clearAllCache(): void {
//     this._agentCache.clear();
//     this._modelCache.clear();
//     this._toolsCache = null;
//     this._toolsCacheExpiry = 0;
//   }
// }

// // 获取系统提示词
// function getSystemPrompt(): string {
//   return `# Role: 你是一名code专家
//     ## Profile
//     - language: 中文
//     - description: 基于工具返回结果进行回答的AI助手，避免主观推测和不确定表述。
//     ## Skills
//     - 能够识别何时使用外部工具以获取最新或精确信息
//     - 严格基于 tool 返回的内容生成回答
//     ## Rules
//     1. 必须优先调用可用工具进行查询；
//     2. 只能基于工具返回的内容进行回答，**严禁**添加推测、假设、预训练知识；
//     3. 若工具未返回信息或信息不足，须明确指出，并避免回答不确定内容；
//     4. 不得引用与 tool 结果无关的知识；
//     5. 回答需简洁清晰，可引用原始返回段落但应尽量精炼。
//     ## Workflows
//     1. 识别是否涉及需要实时或外部信息的问题；
//     2. 调用合适的工具
//     3. 读取并分析返回内容；
//     4. 仅基于返回内容构建回答；
//     5. 根据用户的提问优先从相关的 tool 学习，并生成相应的代码。
//     `;
// }

// // 确保消息数组中包含系统消息（纯函数）
// function ensureSystemMessage(
//   inputMessages: Array<{ role: 'user' | 'assistant' | 'system'; content: string }>,
// ): Array<{ role: 'user' | 'assistant' | 'system'; content: string }> {
//   if (!inputMessages.some((msg) => msg.role === 'system')) {
//     return [
//       {
//         role: 'system',
//         content: getSystemPrompt(),
//       },
//       ...inputMessages,
//     ];
//   }

//   return inputMessages;
// }

// // 错误处理函数
// function handleDuoChatError(error: unknown, logger: ReturnType<typeof createScopedLogger>) {
//   logger.error('DUO Chat Error:', error);

//   let errorMessage = '处理请求时发生错误';
//   let statusCode = 500;

//   if (error instanceof Error) {
//     errorMessage = error.message;
//     logger.error('Agent调用错误', errorMessage);

//     // 根据错误类型设置状态码和错误信息
//     const errorMappings = [
//       {
//         condition: (msg: string) => msg.includes('API key'),
//         statusCode: 401,
//         message: 'OpenAI API密钥无效或未提供',
//       },
//       {
//         condition: (msg: string) => msg.includes('Rate limit'),
//         statusCode: 429,
//         message: '请求频率超出限制，请稍后再试',
//       },
//       {
//         condition: (msg: string) => msg.includes('timeout'),
//         statusCode: 504,
//         message: '请求超时，请稍后再试',
//       },
//     ];

//     const errorMapping = errorMappings.find((mapping) => mapping.condition(errorMessage));

//     if (errorMapping) {
//       statusCode = errorMapping.statusCode;
//       errorMessage = errorMapping.message;
//     }
//   }

//   return new Response(
//     JSON.stringify({
//       error: 'DUO-CODE-CHAT-ERROR,聊天处理失败',
//       message: errorMessage,
//       code: statusCode,
//     }),
//     {
//       status: statusCode,
//       headers: {
//         'Content-Type': 'application/json',
//         'Access-Control-Allow-Methods': '*',
//         'Access-Control-Allow-Headers': '*',
//         'Access-Control-Expose-Headers': '*',
//       },
//     },
//   );
// }

// export { AgentManager, ensureSystemMessage, handleDuoChatError };
